package org.tri.gui.worker;

import org.tri.entity.Productor;
import org.tri.persistence.PersistenceManager;

/**
 * La clase {@code ProductorTransientWorker} es un worker/transienter específico
 * para eliminar entidades del a clase {@code Productor}, ya que para eliminar
 * a los mismos se necesitan realizar unas tareas previas para optimizar
 * la eliminación, que usando Hibernate directamente es bastante lenta.
 * @author kiira
 * @version 1.0, Feb 6, 2012
 */
public class ProductorTransientWorker extends TransientWorker {

    /**
     * Inicializa el worker con el productor a eliminar.
     * @param productor productor a eliminar
     */
    public ProductorTransientWorker( Productor productor ) {
        super( productor );

    }//end constructor

    /**
     * {@inheritDoc} 
     */
    @Override
    protected Object doInBackground() throws Exception {
        Productor productor = (Productor)objectToTransient;
        
        //tenemos que eliminar algunas partes del arbol manualmente
        //para evitar errores
        String query = String.format(
                "DELETE FROM venta WHERE establecimiento IN "
                + "(SELECT id_establecimiento FROM establecimiento "
                + "WHERE productor = %s)",
                productor.getIdProductor() );

        PersistenceManager.executeQuery( query );

        query = String.format(
                "DELETE FROM animal WHERE compra IN "
                + "(SELECT id_compra FROM compra WHERE establecimiento IN "
                + "(SELECT id_establecimiento FROM establecimiento "
                + "WHERE productor = %d))",
                productor.getIdProductor() );

        PersistenceManager.executeQuery( query );

        query = String.format(
                "DELETE FROM compra WHERE establecimiento IN "
                + "(SELECT id_establecimiento FROM establecimiento "
                + "WHERE productor = %d)",
                productor.getIdProductor() );

        PersistenceManager.executeQuery( query );
        
        //eliminamos los establecimientos y el productor
        query = String.format(
                "DELETE FROM establecimiento WHERE productor = %d",
                productor.getIdProductor() );

        PersistenceManager.executeQuery( query );        
                
        query = String.format(
                "DELETE FROM productor WHERE id_productor = %d",
                productor.getIdProductor() );

        PersistenceManager.executeQuery( query );
        return null;

    }//end método doInBackground
    
}//end clase ProductorTransientWorker

